package com.supermap.gwfs.message.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class CommonTool {
    private static final String DEFAULT_TIME_TYPE = "yyyyMMddHHmm";
    private static Logger logger = LoggerFactory.getLogger(CommonTool.class);
    //北京时转世界时的时间差
    private static final int BJT_TO_UTC = 8;

    /**
     * 获取报文时间：报文时间是指上午08时或者下午20时
     * @param forecastDate 时间格式为：yyyy-MM-dd
     * @param sequence 时次
     * @return 报文时间
     */
    public static String getUTCForecastTime(String forecastDate, int sequence) {
        SimpleDateFormat dateSDF = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat dateTimeSDF = new SimpleDateFormat("yyyyMMddHH");
        String dateStr = null;
        try {
            Date date = dateSDF.parse(forecastDate);
            date.setHours(sequence - BJT_TO_UTC);
            dateStr = dateTimeSDF.format(date);
        } catch (ParseException e) {
            logger.error("GWFS_MESSAGE:"+CommonTool.class+".getUTCForecastTime:Date Format ERROR!");
        }
        return dateStr;
    }

    /**
     * 获取当前时间对应的世界时
     *
     * @param hour
     * @return
     */
    public static String getUTCTime(int hour, int minutes) {
        return getUTCTime(DEFAULT_TIME_TYPE, hour, minutes);
    }

    /**
     * 获取当前时间对应的世界时
     * @param timeType 时间格式
     * @param hour 时间标记 等于-1时，取当前时间，设置小时分钟无效
     * @return
     */
    public static String getUTCTime(String timeType, int hour, int minutes) {
        Date dateNow = new Date();
        if (hour != -1) {
            dateNow.setHours(hour);
            dateNow.setMinutes(minutes);
        }
        Date date = assistUTCTime(dateNow);
        SimpleDateFormat sdf = new SimpleDateFormat(timeType);
        return sdf.format(date);
    }

    /**
     * object转换成double类型
     *
     * @param param
     * @return
     */
    public static double getDoubleValue(Object param) {
        double value = 0d;
        if (param instanceof Integer) {
            value = ((Integer) param).intValue();
        } else if (param instanceof String) {
            value = Double.parseDouble((String) param);
        } else if (param instanceof Double) {
            value = ((Double) param).doubleValue();
        } else if (param instanceof Float) {
            value = ((Float) param).floatValue();
        } else if (param instanceof Long) {
            value = ((Long) param).longValue();
        } else if (param instanceof BigDecimal) {
            value = ((BigDecimal)param).doubleValue();
        }
        return value;
    }

    /**
     * object转换成double类型
     *
     * @param param
     * @return
     */
    public static String getStringValue(Object param) {
        String value = "";
        if (param instanceof Integer) {
            value = param.toString();
        } else if (param instanceof String) {
            value = (String) param;
        } else if (param instanceof Double) {
            value = param.toString();
        } else if (param instanceof Float) {
            value = param.toString();;
        } else if (param instanceof Long) {
            value = param.toString();;
        }
        return value;
    }

    /**
     * 时间转换世界时
     * @param dateNow 当前时间
     * @return 世界时间
     */
    public static Date assistUTCTime(Date dateNow) {
        // 1、取得本地时间：
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.setTime(dateNow);
        // 2、取得时间偏移量：
        int zoneOffset = cal.get(java.util.Calendar.ZONE_OFFSET);
        // 3、取得夏令时差：
        int dstOffset = cal.get(java.util.Calendar.DST_OFFSET);
        // 4、从本地时间里扣除这些差量，即可以取得UTC时间：
        cal.add(java.util.Calendar.MILLISECOND, -(zoneOffset + dstOffset));
        // 5、获取世界时间
        return new Date(cal.getTimeInMillis());
    }
}
